﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Transactions;
using DevExpress.Web.ASPxEditors;
using System.Data;
using System.Data.OleDb;
using System.IO;
using OfficeOpenXml;

public partial class admincp_phanlophs : AdminPage
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void Page_PreRender(object sender, EventArgs e)
    {
        this.FillDataToDropDownListLopHoc1();
        //this.FillDataToListBoxHocSinhChuaPhanLop();
    }

    private void FillDataToDropDownListLopHoc1()
    {
        ddlLopHoc3.DataSource = ddlLopHoc2.DataSource = ddlLopHoc1.DataSource = db.LopHocs.Where(lh => lh.TrangThai == true);
        ddlLopHoc3.DataTextField = ddlLopHoc2.DataTextField = ddlLopHoc1.DataTextField = "TenLop";
        ddlLopHoc3.DataValueField = ddlLopHoc2.DataValueField = ddlLopHoc1.DataValueField = "MaLop";
        ddlLopHoc1.DataBind();
        ddlLopHoc2.DataBind();
        ddlLopHoc3.DataBind();
    }

    private void FillDataToListBoxHocSinhChuaPhanLop()
    {
        var HocSinhDaDuocPhanLop = from hsdpl in db.PhanLopHocSinhs
                                   select hsdpl.MaHocSinh;
        var HocSinhChuaPhanLop = from hscpl in db.HocSinhs
                                 where !HocSinhDaDuocPhanLop.Contains(hscpl.MaHocSinh)
                                 select hscpl;
        lstHocSinhChuaPhanLop.DataSource = HocSinhChuaPhanLop;
        lstHocSinhChuaPhanLop.TextField = "TenHocSinh";
        lstHocSinhChuaPhanLop.ValueField = "MaHocSinh";
        lstHocSinhChuaPhanLop.DataBind();
    }

    protected void Luu_PhanLopHocSinh1(object sender, EventArgs e)
    {
        try
        {
            using (System.Transactions.TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
            //Để đảm bảo việc phân lớp hoàn toàn thành công mới cập nhật vào CSDL ta nên dùng Transaction
            //Việc dùng TransactionScope cần phải thêm reference System.Transactions vào project
            {
                HocSinh hocsinh = new HocSinh();
                hocsinh.TenHocSinh = txtTenHocSinh.Text;
                hocsinh.GioiTinh = radNam.Checked;
                if (!String.IsNullOrEmpty(txtNgaySinh.Text))
                    hocsinh.NgaySinh = DateTime.ParseExact(txtNgaySinh.Text, "dd/MM/yyyy", null);
                hocsinh.DiaChi = txtDiaChi.Text;
                hocsinh.DienThoai = txtDienThoai.Text;
                hocsinh.Email = txtEmail.Text;
                if (!String.IsNullOrEmpty(txtNgayNhapHoc.Text))
                    hocsinh.NgayNhapHoc = DateTime.ParseExact(txtNgayNhapHoc.Text, "dd/MM/yyyy", null);
                hocsinh.TrangThai = radSuDung.Checked;
                db.HocSinhs.InsertOnSubmit(hocsinh);
                db.SubmitChanges();
                PhanLopHocSinh phanlophocsinh = new PhanLopHocSinh();
                phanlophocsinh.MaLop = ddlLopHoc1.SelectedValue;
                phanlophocsinh.MaHocSinh = hocsinh.MaHocSinh;
                phanlophocsinh.SoPhuHieu = txtSoPhuHieu.Text;
                phanlophocsinh.SoThuTu = Byte.Parse(txtSoThuTu.Text);
                db.PhanLopHocSinhs.InsertOnSubmit(phanlophocsinh);
                db.SubmitChanges();
                scope.Complete();
                mpe.Show();
            }
        }
        catch
        {
            //Chuyển trang sang trang báo lỗi
        }
    }

    private Byte LayGiaTriSoThuTuLonNhatTrongLop(String MaLopHoc)
    {
        try
        {
            var maxSTT = (from phanlop in db.PhanLopHocSinhs
                          where phanlop.MaLop == MaLopHoc
                          select phanlop.SoThuTu).Max();
            return Byte.Parse(maxSTT.ToString());
        }
        catch
        {
            return 0;
        }
    }

    protected void Luu_PhanLopHocSinh2(object sender, EventArgs e)
    {
        try
        {
            using (System.Transactions.TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
            //Để đảm bảo việc phân lớp hoàn toàn thành công mới cập nhật vào CSDL ta nên dùng Transaction
            //Việc dùng TransactionScope cần phải thêm reference System.Transactions vào project
            {
                Dictionary<long, String> dshocsinh = new Dictionary<long, String>();
                foreach (ListEditItem li in lstHocSinhChonPhanLop.Items)
                {
                    String[] MangTenHS = li.Text.Split(' ');
                    dshocsinh.Add(long.Parse(li.Value.ToString()), MangTenHS[MangTenHS.Length - 1]);
                }

                //Lấy giá trị lớn nhất của số thứ tự hiện tại của lớp
                Byte maxSTT = this.LayGiaTriSoThuTuLonNhatTrongLop(ddlLopHoc2.SelectedValue);
                LopHoc lophoc = db.LopHocs.Single(lh => lh.MaLop == ddlLopHoc2.SelectedValue);
                String KyHieuPhuHieu = lophoc.KyHieuPhuHieu;
                foreach (var item in dshocsinh.OrderBy(item => item.Value))
                {
                    PhanLopHocSinh phanlop = new PhanLopHocSinh();
                    maxSTT++;
                    phanlop.MaLop = ddlLopHoc2.SelectedValue;
                    phanlop.MaHocSinh = item.Key;
                    phanlop.SoPhuHieu = KyHieuPhuHieu + "." + maxSTT.ToString();
                    phanlop.SoThuTu = maxSTT;
                    db.PhanLopHocSinhs.InsertOnSubmit(phanlop);
                    db.SubmitChanges();
                }
                scope.Complete();
                mpe.Show();
            }
        }
        catch
        {
            //Chuyển trang sang trang báo lỗi
        }
    }

    protected void Luu_PhanLopHocSinh3(object sender, EventArgs e)
    {
        try
        {
            //using (System.Transactions.TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
            //{
            String FilePathForImport = String.Concat(Server.MapPath("temp/" + fulFileForImport.PostedFile.FileName));
            fulFileForImport.SaveAs(FilePathForImport);
            FileInfo fileImport = new FileInfo(FilePathForImport);
            using (ExcelPackage package = new ExcelPackage(fileImport))
            {
                ExcelWorksheet worksheet = package.Workbook.Worksheets[1];
                int rowsCount = worksheet.Dimension.End.Row;
                for (int i = 3; i <= rowsCount; i++) //Mẫu file Excel dùng để Import danh sách học sinh có giá trị từ dòng thứ 3
                {
                    //Tạo học sing trong CSDL
                    HocSinh hocsinh = new HocSinh();
                    //Cells[i,3]: là Họ và tên đệm trong file excel, Cells[i,4]: là tên của học sinh trong file Excel
                    hocsinh.TenHocSinh = worksheet.Cells[i, 3].Value.ToString() + " " + worksheet.Cells[i, 4].Value.ToString();
                    hocsinh.TrangThai = true;
                    db.HocSinhs.InsertOnSubmit(hocsinh);
                    db.SubmitChanges();

                    //Tiến hành phân lớp cho học sinh vừa tạo trong CSDL trên
                    PhanLopHocSinh phanlop = new PhanLopHocSinh();
                    phanlop.MaHocSinh = hocsinh.MaHocSinh;
                    phanlop.MaLop = ddlLopHoc3.SelectedValue;
                    phanlop.SoThuTu = Byte.Parse(worksheet.Cells[i, 1].Value.ToString());
                    phanlop.SoPhuHieu = worksheet.Cells[i, 2].Value.ToString();
                    db.PhanLopHocSinhs.InsertOnSubmit(phanlop);
                    db.SubmitChanges();
                }
            }
            //    scope.Complete();
            //}
        }
        catch
        {
            //Chuyển trang sang trang báo lỗi
        }
    }
    
    private void ResetAllControlToDefault()
    {
        txtDiaChi.Text = "";
        txtDienThoai.Text = "";
        txtEmail.Text = "";
        txtNgayNhapHoc.Text = "";
        txtNgaySinh.Text = "";
        txtSoPhuHieu.Text = "";
        txtSoThuTu.Text = "";
        txtTenHocSinh.Text = "";
        ddlLopHoc1.SelectedIndex = -1;
    }
    protected void btnLoadDataToListBox_Click(object sender, EventArgs e)
    {
        this.FillDataToListBoxHocSinhChuaPhanLop();
    }
}